package com.chen.base.utils.basic;

import lombok.experimental.UtilityClass;

import java.math.BigDecimal;

/**
 * @Author: 陈锦龙
 * @Date: 2023/4/10 8:31
 */
@UtilityClass
public class BigDecimalUtil {

    /**
     * 默认返回值
     */
    private final BigDecimal defaultRe = null;

    /**
     * 保留几位小数，默认采用四舍五入的模式
     * @param va 原始数
     * @param digit 位数
     * @return 保留几位小数后的数
     */
    public BigDecimal scale(BigDecimal va,int digit){
        if (va == null){
            return defaultRe;
        }
        return va.setScale(digit,BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 求差
     * @param sub 减数
     * @param minu 被减数
     * @return 相减之后的数
     */
    public BigDecimal subtract(Double sub,Double minu){
        if (sub == null || minu == null){
            return defaultRe;
        }
        return valueOf(sub).subtract(valueOf(minu));
    }

    /**
     * 求和
     * @param va1 数1
     * @param va2 数2
     * @return 相加之后的数
     */
    public BigDecimal add(Double va1,Double va2){
        if (va1 == null || va2 == null){
            return defaultRe;
        }
        return valueOf(va1).add(valueOf(va2));
    }

    /**
     * 求va1和va2的积
     * @param va1 数1
     * @param va2 数2
     * @return 相加之后的数
     */
    public BigDecimal multiply(Double va1,Double va2){
        if (va1 == null || va2 == null){
            return defaultRe;
        }
        return valueOf(va1).multiply(valueOf(va2));
    }

    /**
     * 相除
     * @param divisor 除数
     * @param dividend 被除数
     * @return 相除之后的数
     */
    public BigDecimal divide(Double divisor,Double dividend){
        if (divisor == null || dividend == null){
            return defaultRe;
        }
        return valueOf(divisor).divide(valueOf(dividend),BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 求两个BigDecimal数的最大值
     * @param va1 数1
     * @param va2 数2
     * @return 最大值
     */
    public BigDecimal max(BigDecimal va1,BigDecimal va2){
        if (va1 == null || va2 == null){
            return defaultRe;
        }
        return va1.max(va2);
    }

    /**
     * 求两个BigDecimal数的最小值
     * @param va1 数1
     * @param va2 数2
     * @return 最小值
     */
    public BigDecimal min(BigDecimal va1,BigDecimal va2){
        if (va1 == null || va2 == null){
            return defaultRe;
        }
        return va1.min(va2);
    }

    /**
     * 绝对值
     */
    public BigDecimal abs(BigDecimal va){
        if (va == null){
            return defaultRe;
        }
        return va.abs();
    }

    private BigDecimal valueOf(Double value){
        return BigDecimal.valueOf(value);
    }
}
